package com.jason.rxjavatest;

import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import rx.Observable;
import rx.functions.Action1;
import rx.functions.Func1;

/**
 * RxJava test2  操作符
 *
 * @Author: Jason
 * @Date: 16/4/29
 * @Time: 15:04
 */

public class RxJavaTest02 extends AppCompatActivity {

    private static final String TAG = RxJavaTest02.class.getSimpleName();

    TextView tv_content;
    private List<String> listUrl = new ArrayList<>();
    private List<String> saveList = new ArrayList<>();

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_rxjava2);

        findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(RxJavaTest02.this, RxJavaTest03.class));
            }
        });

        tv_content = (TextView) findViewById(R.id.tv_content);

        for (int i = 0; i < 10; i++) {
            if (i % 2 == 0) {
                listUrl.add("http://www.google" + i + ".com");
            } else {
                listUrl.add("http://www.baidu" + i + ".com");
                listUrl.add("http://www.sougou" + i + ".com");
            }
        }


        /**
         * Observable.from()方法，它接收一个集合作为输入，然后每次输出一个元素给subscriber：
         */
        query("Hello, from")
                .subscribe(new Action1<List<String>>() {
                    @Override
                    public void call(List<String> strings) {
                        Observable.from(strings)
                                .subscribe(new Action1<String>() {
                                    @Override
                                    public void call(String s) {
                                        Log.e(TAG, "s------>" + s);
                                    }
                                });
                    }
                });

        query("hello map")
                .map(new Func1<List<String>, Object>() {
                    @Override
                    public Object call(List<String> list) {

                        return list;
                    }
                })
                .subscribe(new Action1<Object>() {
                    @Override
                    public void call(Object o) {

                    }
                });


        /**
         * Observable.flatMap()接收一个Observable的输出作为输入，同时输出另外一个Observable
         * flatMap输出的新的Observable正是我们在Subscriber想要接收的。
         * 现在Subscriber不再收到List<String>，而是收到一些列单个的字符串，就像Observable.from()的输出一样
         */
        query("Hello FlatMap")
                .flatMap(new Func1<List<String>, Observable<String>>() {
                    @Override
                    public Observable<String> call(List<String> strings) {
                        return Observable.from(strings);

                    }
                })
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        Log.e(TAG, "--------flatMap------>" + s);
                    }
                });


        /**
         * 不止这些，我还将两个API的调用组合到一个链式调用中了。
         * 我们可以将任意多个API调用链接起来。大家应该都应该知道同步所有的API调用，
         * 然后将所有API调用的回调结果组合成需要展示的数据是一件多么蛋疼的事情。
         * 这里我们成功的避免了callback hell（多层嵌套的回调，导致代码难以阅读维护）。
         * 现在所有的逻辑都包装成了这种简单的响应式调用
         */
        query("http://www.baidu.com")
                .flatMap(new Func1<List<String>, Observable<String>>() {
                    @Override
                    public Observable<String> call(List<String> strings) {
                        return Observable.from(strings);
                    }
                })
                .flatMap(new Func1<String, Observable<String>>() {
                    @Override
                    public Observable<String> call(String url) {
                        return getTitle(url);
                    }
                })
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        Log.e(TAG, "3--------s------>" + s);
                    }
                });


        /**
         * filter 可以用来过滤subscribe输出的内容
         */
        query("http://www.souhu.com")
                .flatMap(new Func1<List<String>, Observable<String>>() {
                    @Override
                    public Observable<String> call(List<String> strings) {
                        return Observable.from(strings);
                    }
                })
                .flatMap(new Func1<String, Observable<String>>() {
                    @Override
                    public Observable<String> call(String s) {
                        return getTitle(s);
                    }
                })
                .filter(new Func1<String, Boolean>() {
                    @Override
                    public Boolean call(String s) {
                        return !TextUtils.isEmpty(s);
                    }
                })
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        Log.e(TAG, "filter--------s----->" + s);
                    }
                });


        /**
         * take()输出最多指定数量的结果
         */
        query("http://www.souhu.com")
                .flatMap(new Func1<List<String>, Observable<String>>() {
                    @Override
                    public Observable<String> call(List<String> strings) {
                        return Observable.from(strings);
                    }
                })
                .flatMap(new Func1<String, Observable<String>>() {
                    @Override
                    public Observable<String> call(String s) {
                        return getTitle(s);
                    }
                })
                .filter(new Func1<String, Boolean>() {
                    @Override
                    public Boolean call(String s) {
                        return !TextUtils.isEmpty(s);
                    }
                })
                .take(5)
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        Log.e(TAG, "take-------s------>" + s);
                    }
                });


        /**
         * doOnNext()允许我们在每次输出一个元素之前做一些额外的事情，比如这里的保存标题
         */
        query("http://www.souhu.com")
                .flatMap(new Func1<List<String>, Observable<String>>() {
                    @Override
                    public Observable<String> call(List<String> strings) {
                        return Observable.from(strings);
                    }
                })
                .flatMap(new Func1<String, Observable<String>>() {
                    @Override
                    public Observable<String> call(String s) {
                        return getTitle(s);
                    }
                })
                .filter(new Func1<String, Boolean>() {
                    @Override
                    public Boolean call(String s) {
                        return !TextUtils.isEmpty(s);
                    }
                })
                .take(5)
                .doOnNext(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        saveTitleList(s);
                    }
                })
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        Log.e(TAG, "doOnNext---s--->" + s);
                    }
                });


        if(null != saveList) {
            Log.e(TAG, "saveList----->" + saveList.toString());
        }


    }


    public Observable<List<String>> query(String text) {
        listUrl.add(text);
        return Observable.just(listUrl);
    }

    // 返回网站的标题，如果404了就返回null
    public Observable<String> getTitle(String url) {

        String title = "";
        if (url.contains("baidu")) {
            title = "百度";
        } else if (url.contains("google")) {
            title = "谷歌";
        } else if (url.contains("sougou")) {
            title = "";
        }

        return Observable.just(title);

    }

    // 保存标题到集合中
    public void saveTitleList(String title) {
        saveList.add(title);

    }


}
